前一個單元收尾時說過,新問題來了:這麼多 agent 同時在做事,怎麼知道它們真的在做事?更早一步的問題其實是:怎麼知道它們不是在「重複」做事。今天這篇是我撞到的第一面牆。
八月五日我在做一次例行交接。一份工作在上一個 session 手上做到一半,我把交接說明整理成一段文字,交給下一個 session 接手。流程看起來沒問題:說明在、目標在、指示是「接手現有的工作」。
問題是同一份交接說明不只到了一個 session 手上。另一個 session 也拿到它,也照著做了。結果就是兩個 session 各自認領了同一件事,各自建自己的 branch,各自動工。沒有任何一邊發現對方的存在。
我後來在復盤時把這次事件叫「C4 撞車」。名字不重要,重要的是它暴露的東西:我的系統裡,「誰在做這件事」這個資訊,沒有放在任何單一、權威、機器查得到的地方。它存在我最私人的記憶裡,而記憶同步不到三個 session。
撞車發生前,我其實有防範。工作流程裡有一個安全 gate,任務重複的情形會被擋下。舉例來說,一個 issue 已經開了,另一個 session 又去開一樣的 issue,會被拒絕。
但這個 gate 有個盲區。它設計的對象是「重複建立新東西」,對象是重複開 issue。撞車的情形剛好不是這種:issue 已經存在,是合法地接手一項已經登記的工作。 Gate 一查,發現沒有重复的 issue,就放行了。放行之後的下一步,每個 session 都是去認領那個既有的、官方的目標,而「目標已經有人在做了」這件事,沒有任何一個 gate 負責檢查。
事後檢查起來很簡單,但當時的我連「需要檢查」都沒想到。我以為安全 gate 擋了重複開 issue 就夠了。
撞車後我把接手的流程改成有固定三步,這三步是我在活著作業系統的復盤裡寫進去的硬規則。
第一,接手任何已有的工作目標之前,先預設它是活著的。不是「假設沒人做」再證明,而是「假設有人做」再證明方向反過來。查證成本幾分鐘,撞車成本是一整份重做的工。
第二,看時間戳。目標的工作目錄下,把檔案照修改時間排序,最近幾十分鐘內有更新,就是強烈的活著訊號。
第三,查 process。另外把自己經手的 checkout 都列出來,確認目前有沒有別的 session 還掛著同一個 branch。
三步走完都還是「沒有人在動」,才准接手。這三步後來變成我可以直接給任何一個 agent 的接手檢查清單,它現在就放在公開 repo 的 evidence/day-15/,任何 session 都可以直接拿去用。
C4 撞車也直接推了後面幾天的建設。三步檢查能擋住一次流氓接手,但它每次都要手動跑一次,也只在「agent 自己有紀律想起來」時才會跑。
很快意識到光靠每次的紀律不夠。需要一個地方把「這件事誰認領了」寫下來,而且要跨 agent、跨機器都能看到。認領這個動作,需要帶著 timestamp 寫進一個有歷史的系統。
這就是 Work Ledger,我下回說明。
撞車事件讓我開始做工作帳本。今天寫了撞車,明天寫帳本的第一版:一個我做錯了、後來整個拆掉重做的版本。